/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

import java.awt.HeadlessException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import models.Pessoa;
import utils.conexao.DataBase;
import utils.conexao.DataBaseFactory;
import utils.observer.entity.EntitySubject;

/**
 *
 * @author Amauri
 */
public class PessoaDAO {

    private static PessoaDAO instance;
    private EntitySubject subject;
    
    public EntitySubject getSubject(){
        return this.subject;
    }
    
    private PessoaDAO(){
        subject = new EntitySubject();
    }
    
    public static PessoaDAO getInstance(){
        if( instance == null ){
            instance = new PessoaDAO();
        }
        
        return instance;
    }
    
    
    public static void inserir(Pessoa p) {
        try {
            if (!DataBaseFactory.getConexao().persistir(p)) {
                JOptionPane.showMessageDialog(null, "Não foi possível inserir a Pessoa.");
            }
            
            getInstance().getSubject().notifyObservers();
        } catch (IllegalArgumentException | IllegalAccessException | DataBase.DataBaseIDException | DataBase.DataBaseDuplicateIDDeclarationException | HeadlessException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }

    public static void alterar(Pessoa p) {
        try {
            if (!DataBaseFactory.getConexao().persistir(p)) {
                JOptionPane.showMessageDialog(null, "Não foi possível alterar a Pessoa.");
            }
            
            getInstance().getSubject().notifyObservers();
        } catch (IllegalArgumentException | IllegalAccessException | DataBase.DataBaseIDException | DataBase.DataBaseDuplicateIDDeclarationException | HeadlessException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }

    public static void excluir(Pessoa p) {
        try {
            DataBaseFactory.getConexao().excluir(p);
            
            getInstance().getSubject().notifyObservers();
        } catch (DataBase.DataBaseDuplicateIDDeclarationException | DataBase.DataBaseIDException | IllegalArgumentException | IllegalAccessException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }
    
    public static Pessoa getPessoaByLogin(String usuario, String senha) {
        ArrayList<Pessoa> pessoas = getPessoas();

        for (Pessoa pessoa : pessoas) {
            if ( pessoa.getUsuario().equals(usuario) && pessoa.getSenha().equals(senha) ) {
                return pessoa;
            }
        }

        return null;
    }
    
    public static ArrayList<Pessoa> getPessoas() {
        return DataBaseFactory.getConexao().getAll(Pessoa.class);
    }
}